package cn.chen.test;

import java.io.InputStream;
import java.util.Date;
import java.util.List;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricVariableInstance;
import org.activiti.engine.identity.Picture;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Before;
import org.junit.Test;

import cn.chen.bean.Person;

public class testleave {
	
	ProcessEngine processEngine;
	@Before
	public void Start(){
		processEngine = ProcessEngines.getDefaultProcessEngine();
	}
	//流程部署定义 1401------审批流程(流程变量)

	@Test
	public void deloy_inputstream()throws Exception{
		InputStream inputStream=this.getClass().getResourceAsStream("/Leave.bpmn");
		InputStream inputStreamPng=this.getClass().getResourceAsStream("/Leave.png");
		
		Deployment deployment=processEngine.getRepositoryService().createDeployment()
				.name("审批流程(流程变量)")
				.addInputStream("LeaveVariables1.bpmn", inputStream)//指定资源名称
				.addInputStream("LeaveVariables1.png", inputStreamPng)
				.deploy();//发布流程
		System.out.println(deployment.getId()+"------"+deployment.getName());
	}
	
	//启动流程 pid:1501
	@Test
	public void startProcess() throws Exception{
		String processDefinitionKey="leaveProcess";
	    //在启动时设置流程变量
		ProcessInstance p1=processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey);
		System.out.println("pid:"+p1.getId());
	}
	//设置流程变量
	@Test
	public void SetVariables(){
		//获取执行的Service
		TaskService taskService=processEngine.getTaskService();
		//指定办理人
		String assigneeUser="张三";
		String processInstanceId="1501";
		Task task=taskService.createTaskQuery()//创建任务查询
				.taskAssignee(assigneeUser)//指定办理人
				.processInstanceId(processInstanceId)//指定流程实例ID
				.singleResult();
		/**流程变量中存放基本的数据类型*/
		taskService.setVariable(task.getId(), "请假人", "张无忌123");//使用流程变量的名称和流程变量的值设置流程变量，一次设置一个值
		taskService.setVariable(task.getId(), "请假天数", 6);
		taskService.setVariable(task.getId(), "请假日期", new Date());
		Person person=new Person();
		person.setId(1);
		person.setName("翠花");
		taskService.setVariable(task.getId(), "人员信息", person);
     }
	
	//获取流程变量
	@Test
	public void getVariables(){
		TaskService taskService=processEngine.getTaskService();
		//指定办理人
		String assigneeUser="张三";
		//流程实例ID
		String processInstanceId="1501";
		Task task=taskService.createTaskQuery()//创建任务查询
				.taskAssignee(assigneeUser)//指定办理人
				.processInstanceId(processInstanceId)//指定流程实例ID
				.singleResult();
		/*变量中存储基本数据类型*/
		String stringValue=(String)taskService.getVariable(task.getId(), "请假人");
		Integer integerValue=(Integer)taskService.getVariable(task.getId(), "请假天数");
		Date dataValue=(Date)taskService.getVariable(task.getId(), "请假日期");
		System.out.println(stringValue+"   "+integerValue+"    "+dataValue);
		Person person=(Person)taskService.getVariable(task.getId(), "人员信息");
		System.out.println(person.getId());
		System.out.println(person.getName());
	}
	
	public void setAndGetVariables(){
		RuntimeService runtimeService=processEngine.getRuntimeService();
		TaskService taskService=processEngine.getTaskService();
		
		//====================
		//设置变量的方法
		//通过Execution 设置一个变量
	/*	runtimeService.setVariable(executionId, variableName, value);
		//通过Execution设置多个变量
		runtimeService.setVariables(executionId, variablesMap);
		//通过Task设置一个变量
		taskService.setVariable(taskId, variableName, value);
		//通过task设置多个变量
		taskService.setVariables(taskId, variablesMap);
		//在启动实例流程时，同时也设置一点流程变量
		runtimeService.startProcessInstanceByKey(processDefinitionKey, variables);
		//在完成任务时，同时也设置一些流程变量
		taskService.complete(taskId, variables);
		
		///获取流程变量的方法
		runtimeService.getVariable(executionId, variableName)
		
		//通过Exection获取一个变量
		runtimeService.getVariable(executionId, variableName)
		
		//通过Exection获取所有流程变量信息存放Map
		runtimeService.getVariables(executionId,variableName)
		
		
		//通过Task获取一个变量
		taskService.getVariable(taskId, variableName)
		//通过task获取所有变量信息存放Map
		taskService.getVariables(taskId)
		
		//通过Task获取指定流程变量名称的变量信息存放到Map集合中
		taskService.getVariable(taskId, variableName)*/
		
		
/*		说明：
		1）	RuntimeService对象可以设置流程变量和获取流程变量
		2）	TaskService对象可以设置流程变量和获取流程变量
		3）	流程实例启动的时候可以设置流程变量
		4）	任务办理完成的时候可以设置流程变量
		5）	流程变量可以通过名称/值的形式设置单个流程变量
		6）	流程变量可以通过Map集合，同时设置多个流程变量
		Map集合的key表示流程变量的名称
		Map集合的value表示流程变量的值*/

	}
	//查看历史流程变量
	@Test
	public void getHisVariables(){
		List<HistoricVariableInstance> list=processEngine.getHistoryService()
				.createHistoricVariableInstanceQuery()
				.variableName("请假天数")//指定流程变量名称查询
				.list();
		if(list!=null&&list.size()>0){
			for(HistoricVariableInstance hInstance:list){
				System.out.println(hInstance.getVariableName()+"    "+hInstance.getValue());
			}
		}
	}
	//查询流程历史实例
	@Test
	public void queryHistoricProcessInstance() throws Exception{
		//获取历史流程实例 ，返回历史流程实例的集合
		List<HistoricProcessInstance> hpList=processEngine.getHistoryService()
				.createHistoricProcessInstanceQuery()//创建历史流程实例查询
				.processDefinitionKey("leaveProcess")//按照流程定义的key查询
				.orderByProcessInstanceStartTime().desc()//按照流程开始时间降序排序
				.list();//返回结果集
		
		//遍历查看结果
		for(HistoricProcessInstance hiProcessInstance :hpList){
			System.out.print("pid:"+hiProcessInstance.getId()+",");
			System.out.println("pdid:"+hiProcessInstance.getProcessDefinitionId());
			System.out.println("StartTime"+hiProcessInstance.getStartTime());
			System.out.println("endTime:"+hiProcessInstance.getEndTime());
			System.out.println("duration:"+hiProcessInstance.getDurationInMillis());
			System.out.println("===========================");
		}
	}
	@Test
	public void queryHistoricActivityInstance()throws Exception{
		String processInstanceId="1501";
		List<HistoricActivityInstance> hailist=processEngine.getHistoryService()
				.createHistoricActivityInstanceQuery()//创建历史活动实例查询
				.processInstanceId(processInstanceId)//使用流程实例Id查询
				.orderByHistoricActivityInstanceEndTime().asc()//排序条件
				.list();//执行查询
		for(HistoricActivityInstance his:hailist){
			System.out.println("activityId:"+his.getActivityId());
			System.out.println("name"+his.getActivityName());
			System.out.println("type"+his.getActivityType());
			System.out.println("pid:"+his.getProcessInstanceId());
			System.out.println("assignee"+his.getAssignee());
			System.out.println("startTime"+his.getStartTime());
			System.out.println("endTime"+his.getEndTime());
			System.out.println("duration"+his.getDurationInMillis());
		}
	}

}
